////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "DefaultGameImpl.hpp"

#include <SFML/Graphics.hpp>

#include "DataManager.hpp"
#include "MessageDispatcher.hpp"
#include "../Entity/EntityManager.hpp"
#include "../Math/BoundingVolumes/BoundingBox.hpp"

#include <SmegTools/Debug/DebugNew.hpp>

namespace smeg {
    namespace core {

////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////
DefaultGameImpl::DefaultGameImpl() :
    m_pRenderWindow( NULL )
{
}

////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
DefaultGameImpl::~DefaultGameImpl()
{
}

////////////////////////////////////////////////////////////
/// Init the game
////////////////////////////////////////////////////////////
void DefaultGameImpl::Init( sf::RenderWindow* _pRenderWindow ) {
    m_pRenderWindow = _pRenderWindow;

    DataManager::GetInstance();
    EntityManager::GetInstance()->Init( m_pRenderWindow );
    MessageDispatcher::GetInstance();
}

////////////////////////////////////////////////////////////
/// DeInit the game
////////////////////////////////////////////////////////////
void DefaultGameImpl::DeInit() {
    EntityManager::GetInstance()->DeInit();
    DataManager::GetInstance()->DeInit();
}

////////////////////////////////////////////////////////////
/// Manage an incoming event
////////////////////////////////////////////////////////////
void DefaultGameImpl::ManageEvent( const sf::Event& _Event ) {
    if ( sf::Event::Closed == _Event.type ) {
        m_pRenderWindow->close();
    }
}

////////////////////////////////////////////////////////////
/// Update
////////////////////////////////////////////////////////////
void DefaultGameImpl::Update( float _fDeltaTime ) {
    MessageDispatcher::GetInstance()->Update();
    EntityManager::GetInstance()->UpdateEntities( _fDeltaTime );
}

////////////////////////////////////////////////////////////
/// Call all the Render in the other systems
////////////////////////////////////////////////////////////
void DefaultGameImpl::Render() {
    EntityManager::GetInstance()->RenderEntities();
}

#ifdef _DEBUG
void DefaultGameImpl::DebugRender() const {
    EntityManager::GetInstance()->DebugRender();
}
#endif // _DEBUG
    
    } // namespace core
} // namespace smeg